home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-120 < prev    next >
Text File  |  1995-12-31  |  51KB  |  1,443 lines

  1. C.S.M.P. Digest             Sat, 04 Nov 95       Volume 3 : Issue 120
  2.  
  3. Today's Topics:
  4.  
  5.         Adding a Gestalt Handler
  6.         Adobe Portable Document Format (Acrobat) Info
  7.         Bug (memory leak) with NewGWorld?
  8.         FPU and non-FPU comptuers in C
  9.         How do I call a UPP?
  10.         Q: name of file dropped on application
  11.         STL Tutorial?
  12.         Writing to Boot Blocks B-)
  13.         grays vs. colors?
  14.  
  15.  
  16.  
  17. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  18. (pottier@clipper.ens.fr).
  19.  
  20. The digest is a collection of article threads from the internet
  21. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  22. csmp.games. It is designed for people who read news semi-regularly and
  23. want an archive of the discussions.  If you don't know what a
  24. newsgroup is, you probably don't have access to it. Ask your systems
  25. administrator(s) for details. If you don't have access to news, you
  26. may still be able to post messages to the group by using a mail server
  27. like anon.penet.fi (mail help@anon.penet.fi for more information).
  28.  
  29. Each issue of the digest contains one or more sets of articles (called
  30. threads), with each set corresponding to a 'discussion' of a particular
  31. subject.  The articles are not edited; all articles included in this digest
  32. are in their original posted form (as received by our news server at
  33. nef.ens.fr).  Article threads are not added to the digest until the last
  34. article added to the thread is at least two weeks old (this is to ensure that
  35. the thread is dead before adding it to the digest).  Article threads that
  36. consist of only one message are generally not included in the digest.
  37.  
  38. The digest is officially distributed by two means, by email and ftp.
  39.  
  40. If you want to receive the digest by mail, send email to listserv@ens.fr
  41. with no subject and one of the following commands as body:
  42.     help                                Sends you a summary of commands
  43.     subscribe csmp-digest Your Name     Adds you to the mailing list
  44.     signoff csmp-digest                 Removes you from the list
  45. Once you have subscribed, you will automatically receive each new
  46. issue as it is created.
  47.  
  48. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  49. Questions related to the ftp site should be directed to
  50. scott.silver@dartmouth.edu.
  51.  
  52. -------------------------------------------------------
  53.  
  54. >From Scott_Gruby@alumni.hmc.edu (Scott Gruby)
  55. Subject: Adding a Gestalt Handler
  56. Date: Tue, 17 Oct 1995 22:05:06 -0700
  57. Organization: QUALCOMM, Incorporated; San Diego, CA, USA
  58.  
  59. Prior to making my application PowerPC native, I was using the
  60. GestaltValue library to add a gestalt handler that returned a value (the
  61. number of email messages) so that another component could find out the
  62. number of messages w/o AppleEvents or other routines. Since the library is
  63. not PowerPC native, I've writing my own gestalt handler, but have run into
  64. a problem. The problem is that I need to pass a new value into the gestalt
  65. handler at certain times. How can I do this? Since the function is in the
  66. system heap, I can register a new handler with a new value, but I've only
  67. been able to pass in static values. Below are my handlers and the code
  68. that I use to register/update the handler.
  69.  
  70. Any assistance would be appreciated.
  71.  
  72. Thanks.
  73.  
  74.  
  75. static pascal OSErr  myGestaltFunction (OSType selector,long *response)
  76. {
  77.    long theValue = 0;
  78.    // Need to set theValue to a global message count   
  79.    *response = theValue;
  80.    return noErr;
  81. }
  82.  
  83. static pascal OSErr  myRemoveGestaltFunction (OSType selector,long *response)
  84. {
  85.       *response = (long)-1;
  86.       return gestaltUndefSelectorErr;
  87. }
  88.  
  89.  
  90. void UpdateMailCountGestalt(Boolean remove)
  91. {
  92.    long funcSize = 250;
  93.    OSErr err;
  94.    SelectorFunctionUPP  theGestaltFunction;
  95.    Ptr      gestPtr = nil,oldGestPtr = nil;
  96.    
  97.  
  98.    
  99.    if (!remove)
  100.       theGestaltFunction = NewSelectorFunctionProc(myGestaltFunction);
  101.    else
  102.       theGestaltFunction = NewSelectorFunctionProc(myRemoveGestaltFunction);
  103.  
  104.    funcSize = 200;
  105.    gestPtr = NewPtrSysClear(funcSize);
  106.    BlockMove(theGestaltFunction,gestPtr,funcSize);
  107.  
  108.    err = NewGestalt(kMyClass,(SelectorFunctionUPP)gestPtr);
  109.    if (err)
  110.       {
  111.          err= ReplaceGestalt(kMyClass,(SelectorFunctionUPP)gestPtr,
  112.          &(SelectorFunctionUPP)oldGestPtr);
  113.       }
  114.    if (oldGestPtr != nil)
  115.       DisposePtr(oldGestPtr);
  116.    if (err && gestPtr != nil)
  117.       DisposePtr(gestPtr);
  118.       
  119.  
  120.    
  121. }
  122.  
  123. -- 
  124. Scott Gruby
  125. Scott_Gruby@alumni.hmc.edu
  126.  
  127. +++++++++++++++++++++++++++
  128.  
  129. >From Matt Slot <fprefect@umich.edu>
  130. Date: 18 Oct 1995 14:03:27 GMT
  131. Organization: University of Michigan
  132.  
  133. Here is a solution that I used in a recent project. The gestalt handler
  134. manages
  135. 8-bytes of storage within itself (no cache-flushing is necessary!),
  136. enough for
  137. a long "version" value and a long "data" value/pointer/handle.
  138.  
  139. If you decide to use this, drop me a quick message. 
  140.  
  141. Matt Slot, fprefect@umich.edu
  142. <http://www.sils.umich.edu/~fprefect/>
  143.  
  144. // *
  145. ***********************************************************************
  146. ****** *
  147. // *
  148. ***********************************************************************
  149. ****** *
  150.  
  151.  
  152. // File "gestalt stub.h" -
  153.  
  154. #ifndef ____GESTALT_STUB_HEADER____
  155. #define ____GESTALT_STUB_HEADER____
  156.  
  157. // * ************************ * //
  158.  
  159. #define kGestaltStubResource    'GStb'
  160. #define kGestaltStubResID               128
  161.  
  162. #define kGestaltStubVersOffset  0x06
  163. #define kGestaltStubDataOffset  0x0A
  164.  
  165. #define kGestaltStubSelector    'GStb'
  166. #define kGestaltStubVersion             0L
  167.  
  168. typedef struct {
  169.         long version;
  170.         long data;
  171.         } GestaltStub, *GestaltStubPtr;
  172.  
  173. // * ************************ * //
  174. // Function Prototypes
  175.  
  176. short InstallGestaltStub(long type, long version, long data);
  177. short LookupGestaltStub(long type, long version, long *response);
  178.  
  179. #endif  ____GESTALT_STUB_HEADER____
  180.  
  181.  
  182. // *
  183. ***********************************************************************
  184. ****** *
  185. // *
  186. ***********************************************************************
  187. ****** *
  188.  
  189.  
  190. // File "gestalt stub.c" -
  191.  
  192. #include "gestalt stub.h"
  193.  
  194. // * ************************ * //
  195.  
  196. short InstallGestaltStub(long type, long version, long data) {
  197.         short err = 0;
  198.         Handle stubHdl;
  199.         GestaltStubPtr stubData;
  200.         SelectorFunctionUPP stubOut;
  201.  
  202.         if (Gestalt(type, (long *) &stubData) == gestaltUndefSelectorErr) {
  203.                 stubHdl = GetResource(kGestaltStubResource, kGestaltStubResID);
  204.                 if (! stubHdl) return(err = ResError());
  205.                 DetachResource(stubHdl);
  206.                 HLockHi(stubHdl);
  207.                 
  208.                 BlockMoveData(&version, *stubHdl + kGestaltStubVersOffset,
  209. sizeof(version));
  210.                 BlockMoveData(&data, *stubHdl + kGestaltStubDataOffset, sizeof(data));
  211.  
  212.                 err = NewGestalt(type, (SelectorFunctionUPP) *stubHdl);
  213.                 if (err) DisposeHandle(stubHdl);
  214.                 }
  215.           else if (! stubData) return(err = -1);
  216.           else {
  217.                 BlockMoveData(&version, &stubData->version, sizeof(version));
  218.                 BlockMoveData(&data, &stubData->data, sizeof(data));
  219.                 }
  220.         
  221.         return(err);
  222.         }
  223.  
  224. // * ************************ * //
  225.  
  226. short LookupGestaltStub(long type, long version, long *response) {
  227.         short err = 0;
  228.         GestaltStubPtr stubData;
  229.  
  230.         *response = 0;
  231.         stubData = 0;
  232.         if (err = Gestalt(type, (long *) &stubData)) return(err);
  233.         if (stubData->version != version) return(err = -1);
  234.  
  235.         *response = stubData->data;
  236.         return(0);
  237.         }
  238.  
  239.  
  240. // *
  241. ***********************************************************************
  242. ****** *
  243. // *
  244. ***********************************************************************
  245. ****** *
  246.  
  247.  
  248. 'GStb' Resource definition:
  249.  
  250.          LINK       A6,#$0000      
  251.          BRA.S      Anon1+$000E    
  252.          DC.L       0               ; Version storage
  253.          DC.L       0               ; Data Ptr storage
  254.          LEA        Anon1+$0006,A0 
  255.          MOVEA.L    $0008(A6),A1   
  256.          MOVE.L     A0,(A1)        
  257.          CLR.W      $0010(A7)      
  258.          UNLK       A6             
  259.          MOVEA.L    (A7)+,A0       
  260.          ADDQ.W     #$8,A7         
  261.          JMP        (A0)           
  262.  
  263.  - or a straight hex dump -
  264.  
  265.         4E56 0000 6008 0000 0000 0000 0000 
  266.         41FA FFF6 226E 0008 2288 426F 0010 
  267.         4E5E 205F 504F 4ED0
  268.  
  269. // *
  270. ***********************************************************************
  271. ****** *
  272. // *
  273. ***********************************************************************
  274. ****** *
  275.  
  276. Matt Slot, fprefect@umich.edu
  277. <http://www.sils.umich.edu/~fprefect/>
  278.  
  279. ---------------------------
  280.  
  281. >From stuartm@zip.com.au (Stuart Mackinnon)
  282. Subject: Adobe Portable Document Format (Acrobat) Info
  283. Date: 16 Oct 1995 16:29:37 +1000
  284. Organization: Zip Australia Pty Ltd
  285.  
  286. I was wondering, does anybody have the specifications of the adobe acrobat
  287. file format (Portable Document Format - PDF)?
  288.  
  289. I wish to write an acrobat reader for another platform, and it seems that
  290. the only official way for me to get this is to pay membership for the ADA
  291. (Adobe Developer's Association). Since I live outside the US/Canada this
  292. would mean an annual fee of US$700!! 
  293.  
  294. Does anybody know of an easier way for me to get the acrobat file format?
  295.  
  296. Does anybody know an e-mail address of someone at adobe that I could
  297. discuss my problem with?
  298.  
  299. Does anybody have the acrobat format specs that they could send me?
  300.  
  301. ANY help regarding this matter would be greatly appreciated.
  302.  
  303. Regards,
  304.  
  305. Stuart MacKinnon.
  306.  
  307. +++++++++++++++++++++++++++
  308.  
  309. >From rfraser@vanisl.decus.ca
  310. Date: Wed, 18 Oct 1995 19:59:10 GMT
  311. Organization: VANISL Lug, Victoria, BC, Decus Canada
  312.  
  313. In article <45su4h$e2s@zipper.zip.com.au>, stuartm@zip.com.au (Stuart Mackinnon) writes:
  314. >I was wondering, does anybody have the specifications of the adobe acrobat
  315. >file format (Portable Document Format - PDF)?
  316. >
  317. >I wish to write an acrobat reader for another platform, and it seems that
  318. >the only official way for me to get this is to pay membership for the ADA
  319. >(Adobe Developer's Association). Since I live outside the US/Canada this
  320. >would mean an annual fee of US$700!! 
  321. >
  322. >Does anybody know of an easier way for me to get the acrobat file format?
  323. >
  324. >Does anybody know an e-mail address of someone at adobe that I could
  325. >discuss my problem with?
  326. >
  327. >Does anybody have the acrobat format specs that they could send me?
  328. >
  329. >ANY help regarding this matter would be greatly appreciated.
  330. >
  331. >Regards,
  332. >
  333. >Stuart MacKinnon.
  334.  
  335.  
  336. There is a book published by Adobe/Addison-Wesley that describes the Portable
  337. Document Format. It was published a couple of years ago, ~$30US.
  338.  
  339. A person I know received a magazine about publishing on the Web, sorry I don't
  340. know the name, but inside the mag was a Adobe Acrobat CD Sampler and it had
  341. the above manual in PDF format. This may be the same CD that Adobe is
  342. advertising is PC Week (Sept 25) as the Adobe Acrobat On-Line Publishing Kit.
  343. It is free if you call Adobe 1-800-521-1976 Ext E1559. Hope this helps.
  344.  
  345.  
  346. +++++++++++++++++++++++++++
  347.  
  348. >From Manuel Veloso <veloso@rt66.com>
  349. Date: 21 Oct 1995 15:18:54 GMT
  350. Organization: Active Paper, Inc
  351.  
  352. In article <45su4h$e2s@zipper.zip.com.au> Stuart Mackinnon,
  353. stuartm@zip.com.au writes:
  354. >I wish to write an acrobat reader for another platform, and it seems that
  355. >the only official way for me to get this is to pay membership for the ADA
  356. >(Adobe Developer's Association).
  357.  
  358. good luck. Even with the .PDF format, you'll need a subset of a
  359. normal PostScript interpreter to render the pages.
  360.  
  361. You can actually just open up a .PDF file in any text editor.
  362. You might have to change the filetype to 'TEXT' first.
  363. - -------------------
  364. Manny Veloso
  365. Digital Plumber
  366. Active Paper, Inc.
  367. http://www.apix.com
  368. Purveyors of fine MagicCap products
  369. - -------------------
  370. "Nothin' out there you haven't seen before now."
  371.  
  372.  
  373. ---------------------------
  374.  
  375. >From jbeeghly@u.washington.edu (K. Beeghly)
  376. Subject: Bug (memory leak) with NewGWorld?
  377. Date: 15 Oct 1995 23:05:43 GMT
  378. Organization: University of Washington
  379.  
  380.  
  381. Hi, I am cross-posting this to c.s.m.p.codewarrior and c.s.m.p.help, 
  382. since at this point I do not know if this is a bug w/CW or with NewGWorld.
  383.  
  384.  
  385. I have the following code:
  386.  
  387. short           i;
  388. Rect            r;
  389. OSErr           theErr;
  390. GWorldPtr       arr[20];
  391. short           nNum;
  392.  
  393.         nNum = 18;
  394.         for(i=0; i<nNum; i++)
  395.         {
  396.                 SetRect(&r, 0, 0, 80, 53);
  397.                 theErr = NewGWorld(&arr[i], 32, &r, nil, nil, 0L);
  398.         }
  399.         // Note: the following is optional.  My code didn't Dispose the GWorld
  400.         // until much later in the code, but I added it here to see if it
  401.         // would make a difference (whicht didn't).
  402.         for(i=0; i<nNum; i++)
  403.                 DisposeGWorld(arr[i]);
  404.  
  405. When I run this code and use he newest version of ZoneRanger (1.6 - way
  406. to go Metrowerks! 1.6 is the best version ever!) to look for memory
  407. leaks, ZR tells me that the code leaks several pointers (each
  408. 256 bytes long).  The number of pointers leaked depends on the number of
  409. times NewGWorld is called.
  410.  
  411. RESULTS:
  412.         nNum    # of pointers leaked
  413.         2               0
  414.         3               0
  415.         4               0
  416.         5               0
  417.         6               0
  418.         7               1
  419.         8               1
  420.         9               1
  421.         10              2
  422.         11              2
  423.         12              3
  424.         13              3
  425.         14              4
  426.         15              4
  427.         16              4
  428.         17              5
  429.         18              5
  430.  
  431.  
  432. As you can see, the loss on not exactly proportional to nNum.
  433.  
  434. Is this documented?  Had anyone else run into this problem?  NewGWorld
  435. doesn't create any pointers, so why am I getting a pointer memory leak?!?
  436.  
  437. I am in great need of an expliantion of this.  If you have any comments
  438. or suggestions, please e-mail me at sd@compumedia.com or
  439. jbeeghly@u.washington.edu.
  440.  
  441.  
  442. Thanks,
  443.  
  444.  
  445.  
  446. Jeff
  447.  
  448. PS.  Oh yea, here are some other things you may want to know:
  449.         * I have plenty of RAM allocated for the application
  450.         * I'm running on a IIci under 7.5.0
  451.  
  452.  
  453. +++++++++++++++++++++++++++
  454.  
  455. >From tim@dierks.org (Tim Dierks)
  456. Date: Tue, 17 Oct 1995 01:45:37 -0700
  457. Organization: Best Internet Communications
  458.  
  459. In article <45s447$3gg@nntp5.u.washington.edu>, jbeeghly@u.washington.edu
  460. (K. Beeghly) wrote:
  461. > [ Code snippet ommitted: allocates a bunch of GWorlds then disposes of them ]
  462. >
  463. >When I run this code and use he newest version of ZoneRanger (1.6 - way
  464. >to go Metrowerks! 1.6 is the best version ever!) to look for memory
  465. >leaks, ZR tells me that the code leaks several pointers (each
  466. >256 bytes long).  The number of pointers leaked depends on the number of
  467. >times NewGWorld is called.
  468. >
  469. > [ Table omitted: # of pointers leaked increases as number of calls to
  470. NewGWorld() increases ]
  471. >Is this documented?  Had anyone else run into this problem?  NewGWorld
  472. >doesn't create any pointers, so why am I getting a pointer memory leak?!?
  473.  
  474. When you create a new handle, the pointer that points at the memory (a
  475. "master pointer") needs to be reserved for your block. Since you've got a
  476. pointer to it, it has to be in a non-relocatable block. When the Memory
  477. Manager runs out of free master pointers, it allocates a new block of 64
  478. (by default). This block is 64*sizeof(void *) long = 256 bytes.
  479.  
  480. The Memory Manager doesn't have the ability to ever free a master pointer
  481. block, so it's a "leak", all right; it's allocated and never freed.
  482. However, it does reuse master pointers, so as long as the number of
  483. handles you create peaks at some point, so will your need for master
  484. pointer blocks.
  485.  
  486. When you create a whole bunch of GWorlds, you use up a bunch of master
  487. pointers for the handles that get created. The Memory Manager is creating
  488. master pointer blocks to store these master pointers.
  489.  
  490. If you are also locking blocks or using non-relocatable blocks, these can
  491. fragment your heap. To avoid this, you should call MoreMasters() several
  492. times at the start of your program. This call allocates a new master
  493. pointer block; if you call it enough times, your app will never run out of
  494. free master pointers, and so it will never allocate another master pointer
  495. block. This puts all the nonrelocatable master pointer blocks at the
  496. bottom of the heap where they  don't fragment your memory.
  497.  
  498. The best way to determine how many times to call MoreMasters() is
  499. empirically; exercise your app and then count how many master pointer
  500. blocks you needed. Call MoreMasters() at least that many times. I usually
  501. add one or two blocks to cover emergencies. To determine how many master
  502. pointer blocks you've got, break into MacsBug and type "hd n"; this will
  503. display all the non-relocatable blocks in your heap. All the blocks that
  504. are 256 (0x100) bytes long are probably master pointer blocks.
  505.  
  506. Enjoy,
  507.  - Tim
  508.  
  509. -- 
  510. Tim Dierks - Software Haruspex - tim@dierks.org
  511. If you can't lick 'em, stick 'em on with a big piece of tape. - Negativland
  512.  
  513. +++++++++++++++++++++++++++
  514.  
  515. >From ari@shore.net (Ari Halberstadt)
  516. Date: Mon, 16 Oct 1995 16:47:13 -0400
  517. Organization: North Shore Access/Eco Software, Inc; (info@shore.net)
  518.  
  519. In article <45s447$3gg@nntp5.u.washington.edu>, jbeeghly@u.washington.edu
  520. (K. Beeghly) wrote:
  521. >When I run this code and use he newest version of ZoneRanger (1.6 - way
  522. >to go Metrowerks! 1.6 is the best version ever!) to look for memory
  523. >leaks, ZR tells me that the code leaks several pointers (each
  524. >256 bytes long).  The number of pointers leaked depends on the number of
  525. >times NewGWorld is called.
  526.  
  527. Whenever you see 256 byte pointers being allocated when you make
  528. apparently unrelated allocations, it is most likely that the Memory
  529. Manager is allocating additional master pointer blocks. This is especially
  530. likely with calls like NewGWorld, which allocate many handles. Using
  531. ZoneRanger, you can determine the number of master pointer blocks that
  532. your application needs by dividing the number of handles by 64. Then,
  533. early in your application's initialization, call the MoreMaster procedure
  534. the required number of times. This will avoid heap fragmentation, since
  535. the master pointers will be allocated low in the heap. For instance, you
  536. could use the following code:
  537.  
  538.    SetApplLimit(GetApplLimit() - additionalStackSize);
  539.    MaxApplZone();
  540.    while (masters-- > 0)
  541.       MoreMasters();
  542.  
  543. Use this code before calling InitGraf.
  544.  
  545. -- Ari Halberstadt (ari@shore.net, ari@world.std.com)
  546. For latest versions of some of my Macintosh software try <ftp://ftp.shore.net/members/ari>.
  547.  
  548. +++++++++++++++++++++++++++
  549.  
  550. >From chris-b@cs.auckland.ac.nz (Chris Burns)
  551. Date: Thu, 19 Oct 1995 16:54:56 +1300
  552. Organization: HyperMedia Unit, Comp Sci, Auckland University
  553.  
  554. In article <45s447$3gg@nntp5.u.washington.edu>, jbeeghly@u.washington.edu
  555. (K. Beeghly) wrote:
  556.  
  557. >I have the following code:
  558. >short           i;
  559. >Rect            r;
  560. >OSErr           theErr;
  561. >GWorldPtr       arr[20];
  562. >short           nNum;
  563. >        nNum = 18;
  564. >        for(i=0; i<nNum; i++)
  565. >        {
  566. >                SetRect(&r, 0, 0, 80, 53);
  567. >                theErr = NewGWorld(&arr[i], 32, &r, nil, nil, 0L);
  568. >        }
  569. >        // Note: the following is optional.  My code didn't Dispose the GWorld
  570. >        // until much later in the code, but I added it here to see if it
  571. >        // would make a difference (whicht didn't).
  572. >        for(i=0; i<nNum; i++)
  573. >                DisposeGWorld(arr[i]);
  574. >When I run this code and use he newest version of ZoneRanger (1.6 - way
  575. >to go Metrowerks! 1.6 is the best version ever!) to look for memory
  576. >leaks, ZR tells me that the code leaks several pointers (each
  577. >256 bytes long).  The number of pointers leaked depends on the number of
  578. >times NewGWorld is called.
  579. >RESULTS:
  580. >        nNum    # of pointers leaked
  581. >        2               0
  582. >        3               0
  583. >        4               0
  584. >        5               0
  585. >        6               0
  586. >        7               1
  587. >        8               1
  588. >        9               1
  589. >        10              2
  590. >        11              2
  591. >        12              3
  592. >        13              3
  593. >        14              4
  594. >        15              4
  595. >        16              4
  596. >        17              5
  597. >        18              5
  598. >As you can see, the loss on not exactly proportional to nNum.
  599. >Is this documented?  Had anyone else run into this problem?  NewGWorld
  600. >doesn't create any pointers, so why am I getting a pointer memory leak?!?
  601.  
  602. Can you say "_MoreMasters"?  Non-relocatable blocks of 256 bytes (0x100)
  603. are exactly what the _MoreMasters call allocates. These blocks contain
  604. master pointers for your applications relocatable block use. This would
  605. make sense as the Memory Manager calls _MoreMasters when it runs out of
  606. free master pointers. This is really bad for your apps memory usage as you
  607. end up with non-relocatable blocks scattered all over your heap - bad
  608. news. 
  609.  
  610. The _MoreMasters trap allocates master pointer blocks with several master
  611. pointers in them. The number of master pointers per block is stored in the
  612. heap header structure for your heap. You need to estimate the _maximum_
  613. number of master pointers your program uses and use this as a guide. Allow
  614. for handles that the OS and toolbox allocate (scrap, window regions,
  615. colour tables, resources, etc).
  616.  
  617. Specifically, remember that a GWorldPtr points to a non-relocatable block
  618. (no master pointer needed) that contains fields including:
  619.  
  620. PixMapHandle portPixMap;
  621. Handle grafVars;
  622. RgnHandle visRgn;
  623. RgnHandle clipRgn;
  624. PixPatHandle bkPixPat;
  625. PixPatHandle pnPixPat;
  626.  
  627. All of which are handle based (reqire one master pointer each). Some of
  628. the structures they reference also have handle based storage.
  629.  
  630.  
  631. You can either:
  632.  
  633. 1) Call _MoreMasters a suitable number of times at the start of your
  634. program. This is compatable and safe, but has a small overhead.
  635.  
  636. 2) Change the number of master pointers per block to how many you want,
  637. then call _MoreMasters once. Remember to change it back to something
  638. sensible after.
  639.  
  640. Chris B
  641. - ---------------------------------------------------------------------
  642. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  643. Internet: chris-b@cs.auckland.ac.nz
  644. Phone:    +64 9 373-7599 x5602
  645. Fax:      +64 9 373-7453                         Async, Therefore I Am.
  646. - ---------------------------------------------------------------------
  647.  
  648. ---------------------------
  649.  
  650. >From Daniel Cote <dcote@Physics.UToronto.CA>
  651. Subject: FPU and non-FPU comptuers in C
  652. Date: Tue, 10 Oct 1995 16:06:18 GMT
  653. Organization: University of Toronto - Dept. of Physics
  654.  
  655.  
  656. Does anyone know if it is possible to generate one (and only one) C code
  657. that would run on both FPU and non-FPU computers, using the FPU when
  658. present, and using the non-fpu routines when no FPU is present...?
  659.  
  660. It seems impossible because the adresses of each routine is resolved at 
  661. compile time, which results in code that can not "decide" which routine 
  662. to use. Is it a limit of the C language?  Should I use assemlby language? 
  663.  
  664. It seems to me that I might be able to link two different CODE 
  665. ressources (one with FPU, one without FPU) and throw away the one I 
  666. don't need after I checked for the existance of FPU.  Does anyone know 
  667. anything about that?
  668.  
  669.  
  670.  
  671. - -----------
  672. Daniel Cote                       "If it moves, it's Biology.
  673. U of Toronto Physics Dept.             If it stinks, it's Chemistry.
  674. dcote@physics.utoronto.ca                  If it doesn't work, it's Physics."
  675.  
  676.                        Support ISO-8859-1 Standard!
  677.  
  678.  
  679.  
  680. +++++++++++++++++++++++++++
  681.  
  682. >From deline@netcom.com (James Deline)
  683. Date: Tue, 10 Oct 1995 23:18:52 GMT
  684. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  685.  
  686. Daniel Cote (dcote@Physics.UToronto.CA) wrote:
  687.  
  688. : Does anyone know if it is possible to generate one (and only one) C code
  689. : that would run on both FPU and non-FPU computers, using the FPU when
  690. : present, and using the non-fpu routines when no FPU is present...?
  691.  
  692. [snip]
  693.  
  694. I did something like that in a program I wrote.  I compiled one source 
  695. file in its own project with the floating point options set.  All of the 
  696. function names in this source file differed from the original file in 
  697. that the names began with "fp_".  I then included this project in my 
  698. other project (under Think C) and everytime I needed to call one of the 
  699. functions in that particular source file, I checked a global variable 
  700. that I initialized at runtime to determine if I could call the floating 
  701. point routines or not.  I then called either "fp_function" or "function" 
  702. depending upon the global variable value.
  703.  
  704. Not pretty, but it worked most excellently.  The main problem is when you 
  705. change the source code in one file you have to make the same changes in 
  706. the other one, recompile it, and then re-include it in your main project.
  707.  
  708. jd
  709.  
  710.  
  711.  
  712. +++++++++++++++++++++++++++
  713.  
  714. >From hoshi@sra.co.jp (Hoshi Takanori)
  715. Date: 18 Oct 1995 10:10:14 GMT
  716. Organization: Software Research Associates, Inc.,Japan
  717.  
  718. In article <delineDG9A3G.HnM@netcom.com> deline@netcom.com (James Deline) writes:
  719.  
  720. > Not pretty, but it worked most excellently.  The main problem is when you 
  721. > change the source code in one file you have to make the same changes in 
  722. > the other one, recompile it, and then re-include it in your main project.
  723.  
  724. Why don't you use the standard cpp technique:
  725.  
  726. #ifdef FLOATING_POINT
  727. #ifdef __STDC__
  728. #define FP(func) fp_##func
  729. #else
  730. #define FP(func) fp_/**/func
  731. #endif
  732. #else
  733. #define FP(func) func
  734. #endif
  735.  
  736. double FP(foo)(double arg1, ... );
  737.  
  738. hoshi
  739.  
  740. ---------------------------
  741.  
  742. >From timmyd@netcom.com (Tim DeBenedictis)
  743. Subject: How do I call a UPP?
  744. Date: Fri, 13 Oct 1995 17:19:42 GMT
  745. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  746.  
  747. I have this situation where I am given a UPP, and I want to call the 
  748. function it refers to from within my own code.  Now, I know that on a 68K 
  749. Mac, a UPP is an actual function pointer, so all I have to do is:
  750.  
  751. result = (*upp) ( arg1, arg2, arg3, ... );
  752.  
  753. On the PowerPC, the UPP is -not- the actual function pointer, but instead 
  754. contains the function pointer, plus some other descriptive stuff.  What 
  755. do I do here?  Is there any easy answer?
  756.  
  757. -Tim DeBenedictis
  758. timmyd@netcom.com
  759.  
  760.  
  761. +++++++++++++++++++++++++++
  762.  
  763. >From dazuma@cco.caltech.edu (Daniel Azuma)
  764. Date: Sun, 15 Oct 1995 22:24:38 -0700
  765. Organization: California Institute of Technology, Pasadena
  766.  
  767. timmyd@netcom.com (Tim DeBenedictis) wrote:
  768.  
  769. > I have this situation where I am given a UPP, and I want to call the 
  770. > function it refers to from within my own code.  Now, I know that on a 68K 
  771. > Mac, a UPP is an actual function pointer, so all I have to do is:
  772. > result = (*upp) ( arg1, arg2, arg3, ... );
  773. > On the PowerPC, the UPP is -not- the actual function pointer, but instead 
  774. > contains the function pointer, plus some other descriptive stuff.  What 
  775. > do I do here?  Is there any easy answer?
  776.  
  777. The universal headers supply macros for you to use to call the UPP. For
  778. example, to call a modal dialog filter proc, use:
  779.  
  780. ModalFilterUPP myUPP;
  781. DialogRef theDialog;
  782. EventRecord theEvent;
  783. short itemHit;
  784. Boolean result;
  785.  
  786. result = CallModalFilterProc(myUPP, theDialog, &theEvent, &itemHit);
  787.  
  788. These macros will expand to either the 68k code you described above, or
  789. the appropriate CFM call to CallUniversalProc(), depending on how your
  790. code is being compiled.
  791.  
  792. If you are constructing your own UPP type, you'll need to create your own
  793. macro. Probably the best way to learn how is to study the examples given
  794. in the universal headers.
  795.  
  796.  
  797. Hope this helps.
  798.  
  799. Dan
  800.  
  801.                                                                 +-+
  802. ================================================================| |=======
  803.  \ _____ Daniel Azuma _____ \ "See what love the Father has  +--+ +--+  /
  804.   \ <dazuma@cco.caltech.edu> \  given us, that we should be  +--+ +--+ /
  805.    \    Caltech CS Student    \  called children of God..."     | |   /
  806.     \  Mac Programming Artist  \            ---1 John 3:1       | |  /
  807.     ============================================================| |===
  808.                                                                 | |
  809.                                                                 +-+
  810.  
  811. +++++++++++++++++++++++++++
  812.  
  813. >From keeley@piglet.otago.ac.nz (Michael Keeley)
  814. Date: 15 Oct 1995 22:16:38 GMT
  815. Organization: Computer Graphics Lab, University of Otago
  816.  
  817. Tim DeBenedictis (timmyd@netcom.com) wrote:
  818. > I have this situation where I am given a UPP, and I want to call the 
  819. > function it refers to from within my own code.  Now, I know that on a 68K 
  820. > Mac, a UPP is an actual function pointer, so all I have to do is:
  821.  
  822. > result = (*upp) ( arg1, arg2, arg3, ... );
  823.  
  824. > On the PowerPC, the UPP is -not- the actual function pointer, but instead 
  825. > contains the function pointer, plus some other descriptive stuff.  What 
  826. > do I do here?  Is there any easy answer?
  827.  
  828. While the UPP is not the function pointer, is does point to glue which
  829. will do any necessary mode swapping, call your function, and then swap
  830. the mode back. So you should be able to call the UPP anyway (That's
  831. why it's called Universal).
  832.  
  833. Mike.
  834.  
  835. --
  836. ===========================================================
  837.  Michael Keeley                     Dept. Computer Science
  838.  +64 (3) 479-8488                   University of Otago
  839.  keeley@atlas.otago.ac.nz           New Zealand
  840. ===========================================================
  841.  
  842. +++++++++++++++++++++++++++
  843.  
  844. >From erichsen@pacificnet.net (Erichsen)
  845. Date: Sun, 15 Oct 1995 17:53:59 -0700
  846. Organization: Disorganized
  847.  
  848. Tim DeBenedictis (timmyd@netcom.com) wrote:
  849. > I have this situation where I am given a UPP, and I want to call the 
  850. > function it refers to from within my own code.  Now, I know that on a 68K 
  851. > Mac, a UPP is an actual function pointer, so all I have to do is:
  852.  
  853. > result = (*upp) ( arg1, arg2, arg3, ... );
  854.  
  855. > On the PowerPC, the UPP is -not- the actual function pointer, but instead 
  856. > contains the function pointer, plus some other descriptive stuff.  What 
  857. > do I do here?  Is there any easy answer?
  858.  
  859. If the UPP is for a Toolbox routine, there's most likely a macro that you
  860. can call to call the routine correctly for 680x0 or PowerPC code. Look in
  861. the header file of the mananger the routine is related to for a
  862. CallxxxProc macro (ie. Control-related routine would be in Controls.h. If
  863. not, you can use CallUniversalProc to call the routine.
  864.  
  865. For example, to call a control action proc, you use:
  866.  
  867. CallControlActionProc( userRoutine, theControl, partCode )
  868.  
  869. +++++++++++++++++++++++++++
  870.  
  871. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  872. Date: Thu, 19 Oct 1995 18:02:22 -0500
  873. Organization: Univ of Wisc-Madison, Dept of Biochemistry
  874.  
  875. In article <45s186$ctc@celebrian.otago.ac.nz>, keeley@piglet.otago.ac.nz
  876. (Michael Keeley) wrote:
  877.  
  878. : Tim DeBenedictis (timmyd@netcom.com) wrote:
  879. : > I have this situation where I am given a UPP, and I want to call the 
  880. : > function it refers to from within my own code.  Now, I know that on a 68K 
  881. : > Mac, a UPP is an actual function pointer, so all I have to do is:
  882. : > result = (*upp) ( arg1, arg2, arg3, ... );
  883. : > On the PowerPC, the UPP is -not- the actual function pointer, but instead 
  884. : > contains the function pointer, plus some other descriptive stuff.  What 
  885. : > do I do here?  Is there any easy answer?
  886. : While the UPP is not the function pointer, is does point to glue which
  887. : will do any necessary mode swapping, call your function, and then swap
  888. : the mode back. So you should be able to call the UPP anyway (That's
  889. : why it's called Universal).
  890.  
  891. The problem is that for 68k code a UPP _is_ a function pointer so trying
  892. to call it from PPC will cause bad things to happen.  What you need to do
  893. is use calluniversalproc() to be safe.
  894.  
  895. -- 
  896. Ken Prehoda, kenp@nmrfam.wisc.edu
  897.  
  898. ---------------------------
  899.  
  900. >From d4uc@jupiter.sun.csd.unb.ca (boy wonder)
  901. Subject: Q: name of file dropped on application
  902. Date: 16 Oct 1995 21:33:33 GMT
  903. Organization: University of New Brunswick, Fredericton, NB, Canada
  904.  
  905. How can I get the name of the file that I drop on my application?  
  906. I need to read data from a text file. Right now, I read from 
  907. hardcoded 'datafile', which means that I must rename my files 
  908. each time I want a new one read.  This is a terrible nuissance, one 
  909. that my mac should be able to handle easily.  But how do I do it? 
  910. I am using Symantec C++.
  911.  
  912. Are argv and argc the way to go? Or do those make any sense in 
  913. mac programming? The manuals I have are either unrelated to 
  914. the mac environment, or are hopelessly convoluted.
  915.  
  916. Thanks, Mike.
  917.  
  918. +++++++++++++++++++++++++++
  919.  
  920. >From daniel_t@gate.net (Daniel T.)
  921. Date: Tue, 17 Oct 1995 18:23:55 -0400
  922. Organization: CyberGate
  923.  
  924. In article <45uj3d$4cq@sol.sun.csd.unb.ca>, d4uc@jupiter.sun.csd.unb.ca
  925. (boy wonder) wrote:
  926.  
  927. >How can I get the name of the file that I drop on my application?  
  928. >I need to read data from a text file. Right now, I read from 
  929. >hardcoded 'datafile', which means that I must rename my files 
  930. >each time I want a new one read.  This is a terrible nuissance, one 
  931. >that my mac should be able to handle easily.  But how do I do it? 
  932. >I am using Symantec C++.
  933. >
  934. >Are argv and argc the way to go? Or do those make any sense in 
  935. >mac programming? The manuals I have are either unrelated to 
  936. >the mac environment, or are hopelessly convoluted.
  937.  
  938. The information you seek in is the Segment Loader section of IM (don't
  939. know what book). argv and argc don't work you have to call the functions
  940. below instead.
  941.  
  942. When the Finder starts up your application, it passes along a list of
  943. documents selected by the user to be printed or opened, if any.
  944. - ------------------
  945. extern pascal void CountAppFiles(short *message, short *count);
  946.  
  947. The above function returns the number of selected documents in the count
  948. parameter, and the number in the message parameter that indicates whether
  949. the documents are to be  opened or printed.
  950. - ------------------
  951. extern pascal void GetAppFiles(short index, AppFile *theFile);
  952.  
  953. The index parameter indicates the file for which information should be
  954. returned; it must be between 1 and the number returned by CountAppFiles,
  955. inclusive.
  956. - ------------------
  957. extern pascal void ClrAppFiles(short index);
  958.  
  959. ClrAppFiles changes the Finder information passed to your application
  960. about the specified file such that the Finder knows you've processed the
  961. file.
  962. - ----------------+------------------------------------------
  963. Daniel T.         |  SCA: Lord Nicolas Bradwater, KMoC
  964. Clearwater, FL    |  IGS: DanielT
  965. daniel_t@gate.net |  IRC: DanielT
  966.  
  967. +++++++++++++++++++++++++++
  968.  
  969. >From dazuma@cco.caltech.edu (Daniel Azuma)
  970. Date: Wed, 18 Oct 1995 19:42:55 -0700
  971. Organization: California Institute of Technology, Pasadena
  972.  
  973. In article <45uj3d$4cq@sol.sun.csd.unb.ca>, d4uc@jupiter.sun.csd.unb.ca
  974. (boy wonder) wrote:
  975.  
  976. > How can I get the name of the file that I drop on my application?  
  977. > I need to read data from a text file. Right now, I read from 
  978. > hardcoded 'datafile', which means that I must rename my files 
  979. > each time I want a new one read.  This is a terrible nuissance, one 
  980. > that my mac should be able to handle easily.  But how do I do it? 
  981. > I am using Symantec C++.
  982. > Are argv and argc the way to go? Or do those make any sense in 
  983. > mac programming? The manuals I have are either unrelated to 
  984. > the mac environment, or are hopelessly convoluted.
  985.  
  986. argv and argc will not help you here. Getting info on drag-and-drop files
  987. requires you to use AppleEvents. (Actually, there is a pre-AppleEvent
  988. method but it is not much easier and is no longer really supported.) The
  989. Finder sends you info on the files dropped on your application through an
  990. "odoc" event.
  991.  
  992. What you need is a copy of Inside Macintosh: Interapplication
  993. Communications. You can also probably find drop-box application frameworks
  994. on the net that include the AppleEvent code pre-written so you don't have
  995. to learn it. I think there was one called "BoxMaker++" or something like
  996. that. I've never used these so I can't comment on how well they work.
  997.  
  998. In general, drag-and-drop is a Macintosh thing, so you'll need to know how
  999. to work with the Mac File Manager API and so forth in order to use it. If
  1000. you just want to write a quick-and-dirty program using the ANSI libraries,
  1001. you may be better off redirecting standard in. Your Symantec C++ user
  1002. manual will tell you how to accomplish that. (I use Metrowerks, and they
  1003. provide a function called "ccommand()", defined in <console.h>, which
  1004. handles this sort of thing.)
  1005.  
  1006. Give your manuals another try. Symantec's manual is actually fairly well done.
  1007.  
  1008. Dan
  1009.  
  1010.                                                                 +-+
  1011. ================================================================| |=======
  1012.  \ _____ Daniel Azuma _____ \ "See what love the Father has  +--+ +--+  /
  1013.   \ <dazuma@cco.caltech.edu> \  given us, that we should be  +--+ +--+ /
  1014.    \    Caltech CS Student    \  called children of God..."     | |   /
  1015.     \  Mac Programming Artist  \            ---1 John 3:1       | |  /
  1016.     ============================================================| |===
  1017.                                                                 | |
  1018.                                                                 +-+
  1019.  
  1020. +++++++++++++++++++++++++++
  1021.  
  1022. >From isis@netcom.com (Mike Cohen)
  1023. Date: Thu, 19 Oct 1995 01:05:04 GMT
  1024. Organization: ISIS International
  1025.  
  1026. In article <daniel_t-1710951823560001@10.0.2.15>,
  1027. daniel_t@gate.net (Daniel T.) wrote:
  1028.  
  1029. >
  1030. >The information you seek in is the Segment Loader section of IM (don't
  1031. >know what book). argv and argc don't work you have to call the functions
  1032. >below instead.
  1033.  
  1034. >extern pascal void CountAppFiles(short *message, short *count);
  1035. >extern pascal void GetAppFiles(short index, AppFile *theFile);
  1036. >extern pascal void ClrAppFiles(short index);
  1037.  
  1038. Those functions are obsolete and shouldn't be used - they're only present
  1039. for backward compatibility in 68K applications. They aren't available for
  1040. native PowerPC code.
  1041.  
  1042. AppleEvents should be used instead.
  1043.  
  1044.  
  1045. --
  1046. Mike Cohen - isis@netcom.com
  1047. Home page: ftp://ftp.netcom.com/pub/is/isis/home.html
  1048. Sound is the same for all the world - Youssou N'dour, "Eyes Open"
  1049.  
  1050. ---------------------------
  1051.  
  1052. >From kastork@nps.navy.mil (Kirk A. Stork)
  1053. Subject: STL Tutorial?
  1054. Date: Tue, 17 Oct 1995 18:29:52 -0700
  1055. Organization: Naval Postgraduate School, Monterey, CA
  1056.  
  1057. Is there a tutorial or users guide for the STL (other than the document
  1058. from HP that comes on the CW CD)?
  1059.  
  1060. Or...would anyone be willing to share some example code using the STL?
  1061.  
  1062. As a relative newbie to C++ programming, the STL looks extremely useful,
  1063. but is a bit beyond my technical knowledge.
  1064.  
  1065. +++++++++++++++++++++++++++
  1066.  
  1067. >From jthill@netcom.com (Jim Hill)
  1068. Date: Thu, 19 Oct 1995 07:17:53 GMT
  1069. Organization: biological <-- hey! a one-word oxymoron!
  1070.  
  1071. In article <kastork-1710951829520001@slippc2.cs.nps.navy.mil>,
  1072. kastork@nps.navy.mil (Kirk A. Stork) wrote:
  1073.  
  1074. >Is there a tutorial or users guide for the STL (other than the document
  1075. >from HP that comes on the CW CD)?
  1076.  
  1077. You want <http://www.cs.rpi.edu/~musser/stl.html>.
  1078.  
  1079. Jim
  1080. -- 
  1081. Jim Hill              Contents public domain and worth $.02 more than you paid.
  1082. jthill@netcom.com     PGPrint: 6B 85 76 D1 EF BA 2C 78  12 25 8A 5A BF F3 37 7E
  1083.  
  1084. +++++++++++++++++++++++++++
  1085.  
  1086. >From jazmann@shell.portal.com (Larry Gerndt)
  1087. Date: 19 Oct 1995 23:09:24 GMT
  1088. Organization: Portal Communications (shell)
  1089.  
  1090. In article <kastork-1710951829520001@slippc2.cs.nps.navy.mil>,
  1091. kastork@nps.navy.mil (Kirk A. Stork) wrote:
  1092.  
  1093. > Is there a tutorial or users guide for the STL (other than the document
  1094. > from HP that comes on the CW CD)?
  1095. > Or...would anyone be willing to share some example code using the STL?
  1096. > As a relative newbie to C++ programming, the STL looks extremely useful,
  1097. > but is a bit beyond my technical knowledge.
  1098.  
  1099. I bumped into a great STL reference book by a company called
  1100. ObjectSpace.   The title is "STL<ToolKit>", cutely named.
  1101. I'd recommend it.
  1102.  
  1103. - -------------------------| Into the Woods
  1104. Larry Gerndt               | It's always when
  1105. jazmann@shell.portal.com   | You think at last you're through and then
  1106. (415) 967-4836             | Into the woods you go again
  1107. - -------------------------| To take another journey -- Stephen Sondheim
  1108.  
  1109.  
  1110. ---------------------------
  1111.  
  1112. >From grinch@ns.moran.com (The Grinch)
  1113. Subject: Writing to Boot Blocks B-)
  1114. Date: Tue, 17 Oct 1995 16:24:33 -0400
  1115. Organization: Vortex Software
  1116.  
  1117. Anyone out there know how I can write to the boot blocks of an HD? Thanks 
  1118. much for the input.
  1119.  
  1120. ÑThe Grinch
  1121.  
  1122. +++++++++++++++++++++++++++
  1123.  
  1124. >From sch@unx.sas.com (Steve Holzworth)
  1125. Date: Wed, 18 Oct 1995 20:17:45 GMT
  1126. Organization: SAS Institute Inc.
  1127.  
  1128. Matt Slot <fprefect@umich.edu> writes:
  1129.  
  1130. >The Grinch, grinch@ns.moran.com writes:
  1131. > > Anyone out there know how I can write to the boot blocks of an HD?
  1132. >Thanks 
  1133. > > much for the input.
  1134.  
  1135. >One suggestion would be to write your information to a DiskCopy image
  1136. >file,
  1137. >then apply the changes to a floppy or hard disk directly from the image. 
  1138.  
  1139. >Matt
  1140.  
  1141. Issue the appropriate SCSI commands directly to the disk via the Mac
  1142. SCSI Manager. (See the SCSI Manager manual from Inside Mac). The boot
  1143. blocks are at specified positions on the volume. SCSI drives are
  1144. addressed as sequential logical blocks from 0-NNN, irrespective of
  1145. platters, heads, cylinders et al of the physical medium.
  1146. --
  1147. Steve Holzworth
  1148. sch@unx.sas.com                    "Do not attribute to poor spelling
  1149. SAS Institute   x6872               That which is actually poor typing..."
  1150. SAS/Macintosh Development Team                            - me
  1151. Cary, N.C.
  1152.  
  1153. +++++++++++++++++++++++++++
  1154.  
  1155. >From steve@mindvision.com (Steve Kiene)
  1156. Date: Thu, 19 Oct 1995 00:39:06 -0700
  1157. Organization: MindVision Software
  1158.  
  1159. In article <sch.814047465@sas.com>, sch@unx.sas.com (Steve Holzworth) wrote:
  1160.  
  1161. > Matt Slot <fprefect@umich.edu> writes:
  1162. > >The Grinch, grinch@ns.moran.com writes:
  1163. > > > Anyone out there know how I can write to the boot blocks of an HD?
  1164. > >Thanks 
  1165. > > > much for the input.
  1166. > >One suggestion would be to write your information to a DiskCopy image
  1167. > >file,
  1168. > >then apply the changes to a floppy or hard disk directly from the image. 
  1169. > >Matt
  1170. > Issue the appropriate SCSI commands directly to the disk via the Mac
  1171. > SCSI Manager. (See the SCSI Manager manual from Inside Mac). The boot
  1172. > blocks are at specified positions on the volume. SCSI drives are
  1173. > addressed as sequential logical blocks from 0-NNN, irrespective of
  1174. > platters, heads, cylinders et al of the physical medium.
  1175.  
  1176. NO! Don't use SCSI commands. To write boot blocks, simply do a _PBWrite
  1177. and set the ioVRefNum to the drive number and ioRefNum to the driver
  1178. reference number.
  1179.  
  1180. This will write to the volume as if it were one big file.
  1181.  
  1182. Steve Kiene
  1183. MindVision Software
  1184.  
  1185. +++++++++++++++++++++++++++
  1186.  
  1187. >From Dave Overton <doverton@iglou.com>
  1188. Date: Thu, 19 Oct 1995 13:26:17 GMT
  1189. Organization: DataStream Imaging Systems, Inc.
  1190.  
  1191. You can write directly to the drive by using direct device driver calls.
  1192. You can get the device driver reference number from the Volume Queue.
  1193. Then just issue Read/Write calls to that driver.
  1194. Here is some code which writes to the second boot block on a floppy.
  1195.  
  1196.         ParamBlockRec           dParams;
  1197.  
  1198.  
  1199.         dParams.ioParam.ioRefNum = -5;                          // floppy disk driver refnum
  1200.                                                                                                 // you would use hard drive driver ref
  1201.         dParams.ioParam.ioVRefNum = whichDrive;         // 1 or 2 for a floppy, ? for
  1202. hard drive
  1203.         dParams.ioParam.ioPosMode = fsFromStart;
  1204.         dParams.ioParam.ioPosOffset = 512;
  1205.         dParams.ioParam.ioReqCount = 512;
  1206.         dParams.ioParam.ioBuffer = diskBuffer;
  1207.         error = PBWrite ( &dParams, false );
  1208.         if ( error != noErr ) {
  1209.         }
  1210.  
  1211. Hope this helps
  1212. daveo
  1213.  
  1214.  
  1215. ---------------------------
  1216.  
  1217. >From carl@zippy.sonoma.edu (Carl Bevil)
  1218. Subject: grays vs. colors?
  1219. Date: 4 Oct 1995 00:23:20 GMT
  1220. Organization: Information Resources and Technology
  1221.  
  1222. Can anyone tell me how to determine if the current monitor is in colors or
  1223. grays mode (like the setting in the monitors control panel).  I am writing a
  1224. program and I need to detect if the user has set their monitor to grays or
  1225. not.
  1226.  
  1227. reply in e-mail if possible.
  1228.  
  1229. Thanks,
  1230.  
  1231.  
  1232. --
  1233.  
  1234.  
  1235. Carl
  1236. carl@zippy.sonoma.edu
  1237.  
  1238. +++++++++++++++++++++++++++
  1239.  
  1240. >From tim@dierks.org (Tim Dierks)
  1241. Date: Wed, 04 Oct 1995 00:35:52 -0700
  1242. Organization: Best Internet Communications
  1243.  
  1244. In article <44sk5o$j3i@nic-nac.CSU.net>, carl@zippy.sonoma.edu (Carl
  1245. Bevil) wrote:
  1246. >Can anyone tell me how to determine if the current monitor is in colors or
  1247. >grays mode (like the setting in the monitors control panel).  I am writing a
  1248. >program and I need to detect if the user has set their monitor to grays or
  1249. >not.
  1250.  
  1251. For any patricular GDevice:
  1252.  
  1253. isColor = TestDeviceAttribute (gdh, gdDevType);
  1254.  
  1255. Inside Macintosh: Imaging With QuickDraw page 5-31.
  1256.  
  1257. -- 
  1258. Tim Dierks - Software Haruspex - tim@dierks.org
  1259. If you can't lick 'em, stick 'em on with a big piece of tape. - Negativland
  1260.  
  1261. +++++++++++++++++++++++++++
  1262.  
  1263. >From larson@base.cs.ucla.edu (Christopher Larson)
  1264. Date: 4 Oct 1995 15:31:36 GMT
  1265. Organization: UCLA, Computer Science Department
  1266.  
  1267. In article <44sk5o$j3i@nic-nac.CSU.net> carl@zippy.sonoma.edu (Carl Bevil) writes:
  1268. >Can anyone tell me how to determine if the current monitor is in colors or
  1269. >grays mode (like the setting in the monitors control panel).  I am writing a
  1270. >program and I need to detect if the user has set their monitor to grays or
  1271. >not.
  1272.  
  1273. There is a bit in the deviceFlags field of the graphics device record which
  1274. indicates whether the device is color or grayscale (I don't remember which
  1275. bit off the top of my head---try looking in IM: Imaging With Quickdraw.)
  1276.  
  1277. That said, if you are doing drawing differently for color vs. grayscale
  1278. devices, you should be using DeviceLoop() so you can do the right thing
  1279. if your window spans two monitors, one which is set for colors and one
  1280. which is set for grayscale. In this case, the deviceFlags are passed as a
  1281. parameter to your callback from DeviceLoop(). Look it up; it's way cool.
  1282. (DeviceLoop() is also described in IM: Imaging w/Quickdraw.)
  1283.  
  1284. --Chris
  1285. _______________________________________________________________________________
  1286. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  1287. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  1288. - -------------------------------------+---------------------------------------
  1289. (Insert Disclaimer Here)               | Who's the man ridin' in the sun?
  1290. UCLA Bruins--1995 NCAA Men's Basketball| Who's the man with the itchy gun?
  1291.              National Champions (yea!) | Who's the man who kills for fun?
  1292. Internet: larson@kingston.cs.ucla.edu  | Psycho Dad, Psycho Dad, PSYCHO DAD!
  1293.  
  1294. +++++++++++++++++++++++++++
  1295.  
  1296. >From jeremyr@dcs.qmw.ac.uk (Jeremy Roussak)
  1297. Date: 8 Oct 1995 08:04:37 GMT
  1298. Organization: Queen Mary & Westfield College, London, England
  1299.  
  1300. In article <tim-0410950035520001@tdierks.vip.best.com>
  1301. tim@dierks.org (Tim Dierks) writes:
  1302.  
  1303. > In article <44sk5o$j3i@nic-nac.CSU.net>, carl@zippy.sonoma.edu (Carl
  1304. > Bevil) wrote:
  1305. > >Can anyone tell me how to determine if the current monitor is in colors or
  1306. > >grays mode (like the setting in the monitors control panel).  I am writing a
  1307. > >program and I need to detect if the user has set their monitor to grays or
  1308. > >not.
  1309. > For any patricular GDevice:
  1310. > isColor = TestDeviceAttribute (gdh, gdDevType);
  1311.  
  1312. However, bear in mind that this doesn't tell you whether the monitor
  1313. itself is colour or greyscale. It's perfectly possible to use the
  1314. Monitors Control Panel to put a greyscale monitor in "colour" mode (I
  1315. do it myself, since it seems to improve the display on my Radius 2-bit
  1316. Pivot monitor). Software will then tell you that the monitor is colour,
  1317. but it ain't...
  1318.  
  1319. Jeremy
  1320.  
  1321. +++++++++++++++++++++++++++
  1322.  
  1323. >From all@bold.com.au (Timothy C. Delaney)
  1324. Date: Wed, 18 Oct 1995 15:32:46 +1000
  1325. Organization: Boxes Objects Links Design Pty Ltd
  1326.  
  1327. In article <4580ml$hpl@epsilon.qmw.ac.uk>, jeremyr@dcs.qmw.ac.uk (Jeremy
  1328. Roussak) wrote:
  1329.  
  1330. > In article <tim-0410950035520001@tdierks.vip.best.com>
  1331. > tim@dierks.org (Tim Dierks) writes:
  1332. > > In article <44sk5o$j3i@nic-nac.CSU.net>, carl@zippy.sonoma.edu (Carl
  1333. > > Bevil) wrote:
  1334. > > >Can anyone tell me how to determine if the current monitor is in colors or
  1335. > > >grays mode (like the setting in the monitors control panel).  I am
  1336. writing a
  1337. > > >program and I need to detect if the user has set their monitor to grays or
  1338. > > >not.
  1339. > > 
  1340. > > For any patricular GDevice:
  1341. > > 
  1342. > > isColor = TestDeviceAttribute (gdh, gdDevType);
  1343. > However, bear in mind that this doesn't tell you whether the monitor
  1344. > itself is colour or greyscale. It's perfectly possible to use the
  1345. > Monitors Control Panel to put a greyscale monitor in "colour" mode (I
  1346. > do it myself, since it seems to improve the display on my Radius 2-bit
  1347. > Pivot monitor). Software will then tell you that the monitor is colour,
  1348. > but it ain't...
  1349. > Jeremy
  1350.  
  1351.    The way I would do it (I've just been setting up something similar) in
  1352. order to get the best of both worlds would be something like ...
  1353.  
  1354. isColour = TestDeviceAttribute(gdh, gdDevType);
  1355. hasColour = HasDepth(gdh, 2, gdDevType, 1));
  1356.  
  1357.    Thus you know both ... I specified 2 bit depth because every monitor which
  1358. supports colour will support 2 bits of it ... subsitute another value
  1359. depending on your needs.
  1360.  
  1361. -- 
  1362.  
  1363.                                        _/_/_/_/
  1364.    __|  __|        _/_|     _/_/_/      _/_|     _/_/_/
  1365.   _/_| _/_|      _/  _|   _/          _/  _|   _/    _/
  1366.  -/ _|_/ _|    _/_/_/_|  _/ _/_/_/  _/_/_/_|  _/    _/
  1367. _/  __/  _|  _/      _|  _/_/_/   _/      _|  _/_/_/
  1368.  
  1369. Tim Delaney
  1370.    Mac/PC Programmer, Bold Pty Ltd   magao@bold.com.au
  1371.    Student, Uni of Wollongong         ctd13@uow.edu.au
  1372.  
  1373. +++++++++++++++++++++++++++
  1374.  
  1375. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  1376. Date: Wed, 18 Oct 1995 10:58:11 -0400
  1377. Organization: Carnegie Mellon, Pittsburgh, PA
  1378.  
  1379. all@bold.com.au (Timothy C. Delaney) writes:
  1380. >    The way I would do it (I've just been setting up something similar) in
  1381. > order to get the best of both worlds would be something like ...
  1382. > isColour = TestDeviceAttribute(gdh, gdDevType);
  1383. > hasColour = HasDepth(gdh, 2, gdDevType, 1));
  1384. >    Thus you know both ... I specified 2 bit depth because every monitor which
  1385. > supports colour will support 2 bits of it ... subsitute another value
  1386. > depending on your needs.
  1387.  
  1388. Ack! No, please. The very fine Radius multisync 17" monitor in front of
  1389. me (attached to a Radius video card, I don't know what type) supports
  1390. 1, 4, 8, 16, and 32 bits of color -- but not 2 bits. Your code
  1391. wouldn't work.
  1392.  
  1393. --Z
  1394.  
  1395. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  1396.  
  1397. +++++++++++++++++++++++++++
  1398.  
  1399. >From sample@esltd.com (Don Sample)
  1400. Date: Wed, 18 Oct 1995 15:46:08 -0400
  1401. Organization: Enterprise Solutions Ltd
  1402.  
  1403. In article <all-1810951532460001@192.0.2.1>, all@bold.com.au (Timothy C.
  1404. Delaney) wrote:
  1405.  
  1406. > I specified 2 bit depth because every monitor which
  1407. > supports colour will support 2 bits of it 
  1408.  
  1409. This is not true.  I am currently using a video card card which only
  1410. supports 8 bit colour.
  1411.  
  1412. ---------------------------
  1413.  
  1414. End of C.S.M.P. Digest
  1415. **********************
  1416.